package BiggerMatrix;

import java.util.Scanner;   
import java.util.Random;

/**
 *
 * Exercise 6.1
 * @author Katrin Baryshnikova
 */

public class BiggerMatrix {
    
    public static void main(String[] args) {
        
        Scanner in = new Scanner(System.in);
        // Читаем количесво строк
        System.out.print("n = ");   
        Integer n = in.nextInt();
        // Читаем количество столбцов
        System.out.print("m = ");
        Integer m = in.nextInt();
        // Создаем матрицу
        Integer[][] matrix = new Integer[n][m];
        Random rn = new Random();
        // Заполняем и выводим матрицу
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                matrix[i][j] = rn.nextInt(5);
                System.out.print(matrix[i][j] + " ");
            }         
            System.out.println();
        }
        // Спрашиваем на какое количество блоков хотим разбить матрицу
        System.out.print("Count of blocks = ");
        Integer cblock = in.nextInt();
        if (n % cblock != 0 || m % cblock != 0) { // если мы не можем разбит матрицу на нужное количество блоков - выводим ошибку
            System.out.println("Error!");
        } else {            
            Integer[][] answer = new Integer[cblock][cblock];   // Ответ
            int l = 0, f = 0; // указатели на смещение в исходной матрице по X(переменная f) и по Y(переменная l)
            int blocklenN= n/cblock;    // длина блока по оси X
            int blocklenM = m/cblock;   // длина блока по оси Y
            // Формируем ответ
            for (int i = 0; i < cblock; i++) {  
                l = 0;  // l устанавливаем в 0 т.к. при перехде в новый блок по оси Y мы должны сместиться на новую строку
                for (int j = 0; j < cblock; j++) {
                    int summ = 0;   // сумма элементов в блоке
                    // считаем сумму элементов в блоке
                    for(int a = f; a < f + blocklenN && a < n; a++) {
                        for(int b = l; b < l + blocklenM && b < m; b++) {
                            summ += matrix[a][b];
                        }
                    }
                    // сохраняем сумму в ответ
                    answer[i][j] = summ;
                    // смещаемся по оси Y в следующий блок
                    l += blocklenM;
                }
                // смещаемся по оси X в следующий блок
                f += blocklenN;
            }
            // Выводим ответ
            for (int i = 0; i < cblock; i++) {
                for (int j = 0; j < cblock; j++) {
                    System.out.print(answer[i][j] + " ");
                }
                System.out.println();
            }
        }
        
    }
}
